Data Sheet - 20th May 2011
              _______         _           ______         _   _     
             |__   __|       | |         |  ____|       | | | |    
                | |_   _ _ __| |__   ___ | |__ ___  _ __| |_| |__  
                | | | | | '__| '_ \ / _ \|  __/ _ \| '__| __| '_ \ 
                | | |_| | |  | |_) | (_) | | | (_) | |  | |_| | | |
                |_|\__,_|_|  |_.__/ \___/|_|  \___/|_|   \__|_| |_|
                _____  _      _   _                              
               |  __ \(_)    | | (_)                             
               | |  | |_  ___| |_ _  ___  _ __   __ _ _ __ _   _ 
               | |  | | |/ __| __| |/ _ \| '_ \ / _` | '__| | | |
               | |__| | | (__| |_| | (_) | | | | (_| | |  | |_| |
               |_____/|_|\___|\__|_|\___/|_| |_|\__,_|_|   \__, |
                                                            __/ |
                       ______                         _    |___/ 
                      |  ____|                       | |  
                      | |__ ___  _ __ _ __ ___   __ _| |_ 
                      |  __/ _ \| '__| '_ ` _ \ / _` | __|
                      | | | (_) | |  | | | | | | (_| | |_ 
                      |_|  \___/|_|  |_| |_| |_|\__,_|\__|
                                                          
The dictionary in TurboForth is a linked list, with the first entry in a 
dictionary entry being a pointer to the *previous* entry.

The dictionary is searched (by FIND) from the most recent entry to the first 
entry, i.e the dictionary is searched in reverse order.

The first entry in a dictionary entry is a pointer to the previous dictionary 
entry. It is a 16-bit word.

The next 16-bit word in the dictionary entry contains:
    * Length of the name of the word (bits 12 to 15)
    * Block number that the word is defined in (bits 2 to 11)
    * Hidden flag (bit 1)
    * Immediate flag (bit 0)
    
    as seen below:
 0                              15
 MSB                           LSB
  x x x x x x x x x x x x x x x x
  | | ~~~~~~~~~~~~~~~~~~~ ~~~~~~~
  | |          |             |
  | |     block number     length
  | hidden
  immediate

The block number is encoded into the word by HEADER during LOADing of a block.
This allows the word to be easily located (if it has been loaded) by use of the 
word WHERE - e.g. WHERE WILLS

Note that since the name of the word can only be 4 bits, the maximum length of
a word is 15 characters.

The next entry in the dictionary entry is the actual text of the word name.
One byte per character, in normal ASCII. The word is padded with a space or zero
if the word is an odd length.

The next entry is the CFA (Code Field Address). This is a pointer to the machine 
code that will be executed when the word is executed. For primitive words, the 
value of the word will be address of the word plus 2 (i.e it points to the word 
immediately following it). For Forth (i.e. high level) words it points to DOCOL.

If the following words were entered at the keyboard immediately after booting:
(i.e RAM is empty)

: MARK ;
: WILLS ;

The dictionary entries would look like this:

   Address  Value
   --------------
 +-> A302   7F04   * POINTER TO PREVIOUS WORD IN CART ROM
 |   A004   0004   * LENGTH OF THE NAME 'MARK'
 |   A006   4D     M
 |   A007   41     A
 ^   A008   52     R
 |   A009   4B     K
 |   A00A   8320   * POINTER TO DOCOL IN PAD RAM
 |   A00C   832E   * POINTER TO EXIT IN PAD RAM
 |
 +-< A00E   A302   * POINTER TO PREVIOUS DICTIONARY ENTRY
     A010   0005   * LENGTH OF WORD 'WILLS'
	 A012   57     W
	 A013   49     I
	 A014   4C     L
	 A015   4C     L
	 A016   53     S
	 A017   00     * PAD TO EVEN ADDRESS
	 A018   8320   * POINTER TO DOCOL IN PAD RAM
	 A01A   832E   * POINTER TO EXIT IN PAD RAM

This can be confirmed by starting TurboForth and holding the ENTER key as it 
starts (to bypass auto loading). Then enter:

    0 $A302 30 DUMP

